package main

/*
* Content: time包-时段、当前时间、时间戳、包常用方法、定时器time.Tick()、超时处理time.After（）
* --------------------------------------------------
* Go如何优雅的对时间进行格式化?: https://juejin.cn/post/6943897665960689678
* Go语言基础之Time包详解: https://www.51cto.com/article/645041.html
 */

import (
	"fmt"
	"time"
)

func MyBagTime() {

	// time包-时段
	fmt.Println("--------------------time包-时段--------------------")

	// 纳秒
	fmt.Printf("纳秒: %d\n", time.Nanosecond)
	// 微秒
	fmt.Printf("微秒: %d\n", time.Microsecond)
	// 毫秒
	fmt.Printf("毫秒: %d\n", time.Millisecond)
	// 秒
	fmt.Printf("秒: %d\n", time.Second)
	// 分钟
	fmt.Printf("分钟: %d\n", time.Minute)
	// 小时
	fmt.Printf("小时: %d\n", time.Hour)

	// 当前时间
	fmt.Println("--------------------当前时间--------------------")

	now := time.Now() //获取当前时间: time.Time
	fmt.Printf("current time: %v\n", now)

	year := now.Year()     //年
	month := now.Month()   //月
	day := now.Day()       //日
	hour := now.Hour()     //小时
	minute := now.Minute() //分钟
	second := now.Second() //秒
	fmt.Printf("当前时间: %d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)

	// 时间戳
	fmt.Println("--------------------时间戳--------------------")

	now2 := time.Now()            // 获取当前时间
	timestamp1 := now2.Unix()     // 时间戳
	timestamp2 := now2.UnixNano() // 纳秒时间戳
	fmt.Printf("current timestamp1: %v\n", timestamp1)
	fmt.Printf("current timestamp2: %v\n", timestamp2)

	// 时间戳 转 time
	timeObj := time.Unix(timestamp1, 0)
	fmt.Printf("时间戳转time: %v\n", timeObj)

	// 常用方法
	fmt.Println("--------------------常用方法--------------------")

	// 获取当前时间
	nowTime := time.Now()
	fmt.Printf("当前时间: %v\n", nowTime)

	// 往日期中 加 时间: Add最大单位是小时, 只能+小时
	nowTimeAdd2 := nowTime.Add(time.Hour * 2)
	fmt.Printf("当前时间+2小时: %v\n", nowTimeAdd2)

	// 往日期中 加 日期: 有三个参数，分别是年，月，日
	nowTimeAdd3 := nowTime.AddDate(2, 3, 3)
	fmt.Printf("往日期中加日期: %v\n", nowTimeAdd3)

	// 时间格式化
	// 年 月 日 时 分 秒
	fmt.Printf("年 月 日 时 分 秒: %v\n", nowTime.Format("2006-01-02 15:04:05"))
	// 24小时
	fmt.Printf("24小时: %v\n", nowTime.Format("2006-01-02 15:04:05 Mon Jan"))
	// 12小时
	fmt.Printf("12小时: %v\n", nowTime.Format("2006-01-02 15:04:05 PM Mon Jan"))
	// 年月日
	fmt.Printf("年月日 : %v\n", nowTime.Format("2006-01-02"))

	// 字符串格式化为时间
	timeString := "2020/09/01 14:01:45"
	stringTime, err := time.Parse("2006/01/02 15:04:05", timeString)
	if err != nil {
		fmt.Println("时间转换失败，", err)
		return
	}
	fmt.Printf("字符串格式化为时间 : %v\n", stringTime)

	// 睡眠
	time.Sleep(time.Second * 2)

	// 定时器time.Tick
	fmt.Println("--------------------定时器time.Tick--------------------")

	ticker := time.Tick(time.Second)
	for i := range ticker {
		fmt.Println(i)
	}

	// 超时处理time.After
	fmt.Println("--------------------超时处理time.After--------------------")

	// 无缓冲 channel
	ch8 := make(chan int)
	quit := make(chan bool) // 用于控制超时, 先阻塞程序运行, 协程阻塞时间到了之后, 会往此 channel 内写入数据, 结束阻塞
	go func() {
		for { // 无线 for 循环
			select {
			case num := <-ch8:
				fmt.Println("Num =", num)
			case <-time.After(time.Second * 3):
				fmt.Println("等待3秒仍未接收到数据, 退出等待！")
				quit <- true // 写入
			}

		}
	}() //别忘了()
}
